import java.util.Scanner;

public class day230329 {
    // 走方格的方案数

    // 动态规划
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();

        int[][] dp = new int[n + 1][m + 1];
        for (int i = 0; i < n + 1; i++) {
            for (int j = 0; j < m + 1; j++) {
                if (i == 0 || j == 0) {
                    // 只能往下或往右走
                    // 第一行和第一列, 在边上, 只有一种走法
                    dp[i][j] = 1;
                } else {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }
        System.out.println(dp[n][m]);
    }

    // 2
    // 优化递归结束条件
    // 发现了一个规律
    // 只有一行 或 只有一列时, 路线数为 行加列
    // 否则就往下和右递归
    public static int walk2(int i, int j) {
        // i 和 j 表示目前剩下的 行 和 列
        if (i == 1 || j == 1) {
            // 只剩下一行或一列的情况, 路线数就是 i + j
            return i + j;
        }
        // 向下 和 向右 递归, i - 1 和 j - 1
        return walk2(i - 1, j) + walk2(i, j - 1);
    }

    // 1
    // 走迷宫一样, 递归
    // 从左上角开始, 只往下和右递归, 直到右下角
    public static int walk(int i, int j) {
        // i 和 j 表示目前剩下的 行 和 列
        if (i == 0 && j == 0) {
            // 到达终点
            return 1;
        }
        return walk(i - 1, j) + walk(i, j - 1);
    }
    public static void main2(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        // int ret = walk2(n, m);
        int ret = walk2(n, m);
        System.out.println(ret);
    }


    // 另类加法
    // 不能使用算术运算符
    public static int addAB2(int A, int B) {
        // 2
        // 0010
        // 3
        // 0011
        // 2 ^ 3
        // 0001
        // 2 & 3 << 1
        // 0100
        while (true) {
            int sum = A ^ B; // A ^ B 就是不考虑进位的结果
            int tmp = A & B; // A & B 如果为0, 就是没有进位
            if (tmp == 0) {
                // 没有进位返回
                return sum;
            }
            // 如果有进位, 让 sum 加上进位 ( sum ^ 进位 )
            A = sum;
            B = tmp << 1;
        }
    }
    public static int addAB(int A, int B) {
        int[] c = new int[32]; // 存放A + B的二进制位

        for (int i = 0; i < 32; i++) {
            // 遍历 A 和 B 的二进制位
            int a = A & (1 << i);
            int b = B & (1 << i);
            if (a != 0 && b != 0) {
                // 当前二进制位都为1, 需要进位
                if (i + 1 < 32) {
                    if (c[i + 1] == 1 && i + 2 < 32) {
                        c[i + 2] = 1;
                        c[i + 1] = 0;
                    } else {
                        c[i + 1] = 1;
                    }
                }
            } else if (a != 0 || b != 0){
                // 当前二进制为只有一个 1, 不进位
                if (c[i] == 1 && i + 1 < 32) {
                    c[i + 1] = 1;
                    c[i] = 0;
                } else {
                    c[i] = 1;
                }
            }
        }

        int ret = 0;
        for (int i = 0; i < 32; i++) {
            if (c[i] == 1) {
                ret ^= 1 << i;
            }
        }

        return ret;
    }
    public static void main1(String[] args) {
        System.out.println(addAB2(26, 13));
        // 0001 1010   26
        // 0000 1101   13
        // 0010 0111
    }
}
